package database;

import java.util.Collections;
import java.util.HashSet;
import java.util.LinkedList;

/**
 * Categoria usada para categorizar Objetos tipo Question 
 * @author Grupo 11 de Programacion Orientada a Objetos
 *
 */

public class Category {
	private int level;
	private HashSet<Question> qset;

	/**
	 * Crea una instancia de Category
	 * @param level - tipo de categoria(0 = fácil,
	 * 1 = medio, 2 = dificil). En caso de recibir un nivel
	 * fuera de este rango, se crea por default en fácil
	 *
	 */
	
	public Category(int level) {
		super();
        qset = new HashSet<Question>();
        
        if (level < 0 || level > 2)
        	this.level = 0;
        else
        	this.level = level;
	}
	
	/**
	 * Obtiene el nivel asociado a la categoria
	 */
	
	public int getLevel() {
		return level;
	}

	/**
	 * Setea el nivel de la categoria, este método
	 * es de utilidad si se quiere migrar toda una categoría
	 * hacia otra dificultad. Si el nivel proporcionado es inválido,
	 * se toma el default (0 = fácil).
	 * @param level - nueva dificultad
	 */
	
	public void setLevel(int level) {
		if (level < 0 || level > 2)
			this.level = 0;
		else
			this.level = level;
	}
	
	/**
	 * Agrega una nueva pregunta de cualquier tipo
	 * a la categoria
	 * @param question - pregunta a agregarse
	 */
	
	public void addQuestion (Question question) {
		qset.add(question);
		return;
	}
	
	/**
	 * Remueve una pregunta existente en la categoria
	 * @param question - pregunta a removerse
	 */
	
	public void removeQuestion(Question question) {
		qset.remove(question);
	}
	
	/**
	 * Devuelve todas las preguntas en dicha categoria
	 * en una nueva lista. En caso de no existir preguntas
	 * en la categoria, retornara null.
	 * @return LinkedList<Question> - lista de preguntas
	 */
	
	public LinkedList<Question> getAll(){
		LinkedList<Question> qlist = null;
		if (qset.size() > 0)
			qlist = new LinkedList<Question>(qset);

		return qlist;
	}

	/**
	 * Devuelve un muestreo de 10 preguntas al azar dentro
	 * de ésta categoria. De no existir esa cantidad, se retorna
	 * null. Las 10 preguntas elegidas son al azar.
	 * @return LinkedList<Question> - 10 preguntas cualesquiera
	 */
	
    public LinkedList<Question> getTriviaQuestions () {
        LinkedList<Question> qlist = new LinkedList<Question>(qset);
        LinkedList<Question> qaux = null;
        
        if (qlist != null && qlist.size() >= 10)
        {
	        qaux = new LinkedList<Question>(qlist.subList(0, 10));
	        Collections.shuffle(qaux);
        }
        
        return qaux;
    }

}
